package com.spzx.order.configure;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

//配置类：用于声明交换机和队列，以及绑定
@Configuration
public class DeadLetterMqConfig {
    // 声明一些变量
    public static final String exchange_dead = "exchange.dead";
    public static final String routing_dead_1 = "routing.dead.1"; //正常路由key
    public static final String routing_dead_2 = "routing.dead.2"; //死信路由key
    public static final String queue_dead_1 = "queue.dead.1"; //正常队列
    public static final String queue_dead_2 = "queue.dead.2"; //死信队列


    //声明交换机
    @Bean
    public Exchange deadExchange(){
        //return new DirectExchange(exchange_dead, true, false, null);
        return ExchangeBuilder.directExchange(exchange_dead).durable(true).build();
    }

    //声明正常队列
    @Bean
    public Queue queueDead1(){
        Map map = new HashMap();
        map.put("x-message-ttl",10*1000); //ttl过期时间10秒。10秒还没有被消费者处理，就去死信队列。
        map.put("x-dead-letter-exchange",exchange_dead); //正常队列消息变为死信，消息交给死信交互机处理。
        map.put("x-dead-letter-routing-key",routing_dead_2); //往死信交换机发死信消息时，指定routingKey
        // exclusive 排队队列，只限于当前连接使用，连接关闭队列自动删除。
        // autoDelete 自动删除。长时间不使用的队列，会被服务器自动删除。
        // map 指定队列相关属性。
        return new Queue(queue_dead_1, true, false, false, map);
        //return QueueBuilder.durable(queue_dead_1).build();
    }

    //声明交换机和正常队列绑定
    @Bean
    public Binding binding1(){
        //生产者发送消息时，需要携带routing_dead_1的值，才能将消息发送到正常队列。
        return BindingBuilder.bind(queueDead1()).to(deadExchange()).with(routing_dead_1).noargs();
    }

    //声明死信队列
    @Bean
    public Queue queueDead2(){
        return new Queue(queue_dead_2, true, false, false);
    }

    //声明死信队列和交换机绑定
    @Bean
    public Binding binding2(){
        //生产者发送消息时，需要携带routing_dead_1的值，才能将消息发送到正常队列。
        return BindingBuilder.bind(queueDead2()).to(deadExchange()).with(routing_dead_2).noargs();
    }
}
